/*
 * zach.h
 *
 *   Created on: 2011-9-24
 *       Author: 左白
 *  Description: 公用头文件
 */

#ifndef ZACH_H_
#define ZACH_H_

#include <vector>
#include <set>
#include <string>
#include <cwchar>

const int null = 0;

#define LENGTH( x )\
	sizeof( x ) / sizeof( x[0] )

namespace zach
{
#if (1) /* 类型引入 */
using std::vector;
using std::string;
using std::wstring;
using std::set;
#endif /* 类型引入 */

#if (1) /* 类型定义 */
#if (1) /* 整数类型 */
typedef char Byte; // 8位符号整数
typedef __int32 Char; // UTF-32字符
typedef __int32 Int; // 32位符号整数
typedef __int64 Long; // 64位符号整数
#endif /* 整数类型 */

#if (1) /* 快捷方式 */
typedef vector<Char> CharVector;
#endif /* 快捷方式 */

#if (1) /* UTF-32字符串 */
// UTF-32字符串
class String
{
public:
	friend String getString( const std::vector<Char>& str ); // 构造函数,使用用串构造
	friend String getString( char c ); // 构造函数,使用char构造
	friend String getString( const char* str ); // 构造函数,使用char*构造
	friend string toString( const String str ); // 转换为CString
private:
	Char* _str; // 内容
	int _length; // 长度
};

String getString( const std::vector<Char>& str );
String getString( const char* str );
String getString( char c );
string toString( const String str );
string toString( const Char* str, int length );
inline string toString( Char c )
{
	return toString( &c, 1 );
}
#endif /* UTF-32字符串 */
#endif /* 类型定义 */

#if (1) /* 全局异常 */
//记录错误的异常类
//目的仅为全局catch
class Error
{
public:
	virtual ~Error()
	{
	}

	//错误内容记录
	virtual string message() const = 0;
};

// 由程序员的错误代码导致的异常
class Fault : virtual public Error
{
public:
	Fault( string msg ) :
			_msg( msg )
	{
	}

	virtual ~Fault()
	{
	}

	virtual string message() const
	{
		return _msg;
	}

private:
	string _msg;
};

// 由于参数超出了定义域所导致的错误
class OutOfDomain : virtual public Error
{
public:
	OutOfDomain( string msg ) :
			_msg( msg )
	{
	}

	virtual ~OutOfDomain()
	{
	}

	virtual string message() const
	{
		return _msg;
	}

private:
	string _msg;
};
#endif /* 全局异常 */
}

#endif /* ZACH_H_ */
